{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### LangGraph的图可视化\n",
    "### Graph Visualization of LangGraph\n",
    "****"
   ]
  },
  {
   "metadata": {},
   "cell_type": "code",
   "source": "! pip install langgraph",
   "outputs": [],
   "execution_count": null
  },
  {
   "metadata": {},
   "cell_type": "code",
   "source": "! pip install python-dotenv",
   "outputs": [],
   "execution_count": null
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-11-13T16:38:28.686886Z",
     "start_time": "2024-11-13T16:38:25.736839Z"
    }
   },
   "source": [
    "import random\n",
    "from langgraph.graph import StateGraph\n",
    "from langgraph.graph.message import add_messages\n",
    "from typing_extensions import TypedDict\n",
    "from typing import Annotated, Literal\n",
    "from dotenv import load_dotenv\n",
    "load_dotenv(verbose=True)\n",
    "\n",
    "\n",
    "class State(TypedDict):\n",
    "    messages: Annotated[list, add_messages]\n",
    "\n",
    "\n",
    "class MyNode:\n",
    "\n",
    "    def __init__(self, name: str):\n",
    "        self.name = name\n",
    "\n",
    "    def __call__(self, state: State):\n",
    "        return {\"messages\": [(\"assistant\", f\"Called node {self.name}\")]}\n",
    "\n",
    "\n",
    "def route(state) -> Literal[\"entry_node\", \"__end__\"]:\n",
    "    if len(state[\"messages\"]) > 10:\n",
    "        return \"__end__\"\n",
    "    return \"entry_node\"\n",
    "\n",
    "\n",
    "def add_fractal_nodes(builder, current_node, level, max_level):\n",
    "    if level > max_level:\n",
    "        return\n",
    "\n",
    "    # Number of nodes to create at this level\n",
    "    num_nodes = random.randint(1, 3)  # Adjust randomness as needed\n",
    "    for i in range(num_nodes):\n",
    "        nm = [\"A\", \"B\", \"C\"][i]\n",
    "        node_name = f\"node_{current_node}_{nm}\"\n",
    "        builder.add_node(node_name, MyNode(node_name))\n",
    "        builder.add_edge(current_node, node_name)\n",
    "\n",
    "        # Recursively add more nodes\n",
    "        r = random.random()\n",
    "        if r > 0.2 and level + 1 < max_level:\n",
    "            add_fractal_nodes(builder, node_name, level + 1, max_level)\n",
    "        elif r > 0.05:\n",
    "            builder.add_conditional_edges(node_name, route, node_name)\n",
    "        else:\n",
    "            # End\n",
    "            builder.add_edge(node_name, \"__end__\")\n",
    "\n",
    "\n",
    "def build_fractal_graph(max_level: int):\n",
    "    builder = StateGraph(State)\n",
    "    entry_point = \"entry_node\"\n",
    "    builder.add_node(entry_point, MyNode(entry_point))\n",
    "    builder.set_entry_point(entry_point)\n",
    "\n",
    "    add_fractal_nodes(builder, entry_point, 1, max_level)\n",
    "\n",
    "    # Optional: set a finish point if required\n",
    "    builder.set_finish_point(entry_point)  # or any specific node\n",
    "\n",
    "    return builder.compile()\n",
    "\n",
    "\n",
    "app = build_fractal_graph(3)\n",
    "\n",
    "#print(app.get_graph().print_ascii())\n",
    "from langchain_core.runnables.graph import CurveStyle, NodeStyles, MermaidDrawMethod\n",
    "from IPython.display import Image, display\n",
    "\n",
    "# 假设 app 是你的应用程序实例，并且已经初始化\n",
    "# 生成图片\n",
    "graph_image = app.get_graph().draw_mermaid_png(\n",
    "    draw_method=MermaidDrawMethod.API)\n",
    "\n",
    "# 显示图片\n",
    "display(Image(data=graph_image))\n",
    "\n",
    "# 将图片保存到文件\n",
    "with open(\"graph.png\", \"wb\") as file:\n",
    "    file.write(graph_image)\n"
   ],
   "outputs": [
    {
     "data": {
      "image/jpeg": "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",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 9
  },
  {
   "metadata": {},
   "cell_type": "code",
   "outputs": [],
   "execution_count": null,
   "source": ""
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "langchain_v0.2",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
